/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dialogs.relatorio;

import dao.DaoObra;
import dao.DaoUsuario;
import java.util.List;
import javax.swing.table.DefaultTableModel;
import libcontrol.model.Debito;
import libcontrol.model.Emprestimo;
import libcontrol.model.Exemplar;
import libcontrol.model.Obra;
import libcontrol.model.Usuario;

/**
 *
 * @author filipe
 */
public class JDialogRelatorio extends javax.swing.JDialog {

    public enum TipoRelatorio {

        OBRAS_EMPRESTADAS,
        OBRAS_RESERVADAS,
        OBRAS_DEVOLUCAO_ATRASO,
        OBRAS_MAIS_RETIRADAS,
        USUARIO_EMPRESTIMO,
        USUARIO_DEVOLUCAO_ATRASO,
        USUARIO_DEBITOS;
    }

    private void preencherTabela(TipoRelatorio tipoRelatorio) {
        DefaultTableModel modelObra = new DefaultTableModel();
        DefaultTableModel modelUsuario = new DefaultTableModel();
        modelUsuario.addColumn("Nome");
        modelUsuario.addColumn("Cpf");
        List findAllList = null;
        switch (tipoRelatorio) {
            case OBRAS_EMPRESTADAS:
                findAllList = new DaoObra().findAllEmprestadas();
                jLabelTitulo.setText("Obras Emprestadas");
                break;
            case OBRAS_RESERVADAS:
                findAllList = new DaoObra().findAllReservadas();
                jLabelTitulo.setText("Obras Reservadas");
                break;
            case OBRAS_DEVOLUCAO_ATRASO:
                findAllList = new DaoObra().findAllDevolucaoAtrasadas();
                jLabelTitulo.setText("Obras com Devoluções Atrasadas");
                break;
            case OBRAS_MAIS_RETIRADAS:
                findAllList = new DaoObra().findAllMaisRetiradas();
                jLabelTitulo.setText("Obras mais retiradas");
                break;
            case USUARIO_DEBITOS:
                findAllList = new DaoUsuario().findAllDevedores();
                jLabelTitulo.setText("Usuários com Débitos");
                break;
            case USUARIO_DEVOLUCAO_ATRASO:
                findAllList = new DaoUsuario().findAllDevolucaoAtraso();
                jLabelTitulo.setText("Usuários com Devoluções Atrasadas");
                break;
            case USUARIO_EMPRESTIMO:
                findAllList = new DaoUsuario().findAllEmprestimo();
                jLabelTitulo.setText("Usuários com Empréstimos");
                break;
        }
        if (findAllList != null) {
            Object[] rowData;
            switch (tipoRelatorio) {
                case OBRAS_EMPRESTADAS:
                    modelObra.addColumn("Obra");
                    modelObra.addColumn("Autor");
                    modelObra.addColumn("Edição");
                    modelObra.addColumn("Editora");
                    rowData = new Object[4];
                    for (Obra obra : (List<Obra>) findAllList) {
                        if (!obra.isExcluida()) {
                            rowData[0] = obra.getTitulo();
                            rowData[1] = obra.getAutor();
                            rowData[2] = obra.getEdicao();
                            rowData[3] = obra.getEditora();
                            modelObra.addRow(rowData);
                        }
                    }
                    jTableRelatorio.setModel(modelObra);
                    break;
                case OBRAS_RESERVADAS:
                    modelObra.addColumn("Obra");
                    modelObra.addColumn("Autor");
                    modelObra.addColumn("Edição");
                    modelObra.addColumn("Editora");
                    modelObra.addColumn("Número de Reservas");
                    rowData = new Object[5];
                    for (Obra obra : (List<Obra>) findAllList) {
                        if (!obra.isExcluida()) {
                            rowData[0] = obra.getTitulo();
                            rowData[1] = obra.getAutor();
                            rowData[2] = obra.getEdicao();
                            rowData[3] = obra.getEditora();
                            rowData[4] = obra.getReservasAtivas().size();
                            modelObra.addRow(rowData);
                        }
                    }
                    jTableRelatorio.setModel(modelObra);
                    break;
                case OBRAS_DEVOLUCAO_ATRASO:
                    modelObra.addColumn("Código Obra");
                    modelObra.addColumn("Obra");
                    modelObra.addColumn("Dias de Atraso");
                    rowData = new Object[3];
                    for (Obra obra : (List<Obra>) findAllList) {
                        if (!obra.isExcluida()) {
                            for (Exemplar exemplar : obra.getExemplaresAtivos()) {
                                for (Emprestimo emprestimo : exemplar.getEmprestimos()) {
                                    if (emprestimo.isAtrasado()) {
                                        rowData[0] = exemplar.getId();
                                        rowData[1] = obra.getTitulo();
                                        rowData[2] = emprestimo.getDiasAtrasado();
                                        modelObra.addRow(rowData);
                                    }
                                }
                            }
                        }
                    }
                    jTableRelatorio.setModel(modelObra);
                    break;
                case OBRAS_MAIS_RETIRADAS:
                    modelObra.addColumn("Obra");
                    modelObra.addColumn("Autor");
                    modelObra.addColumn("Edição");
                    modelObra.addColumn("Editora");
                    modelObra.addColumn("Número de retiradas");
                    rowData = new Object[4];
                    for (Obra obra : (List<Obra>) findAllList) {
                        if (!obra.isExcluida()) {
                            rowData[0] = obra.getTitulo();
                            rowData[1] = obra.getAutor();
                            rowData[2] = obra.getEdicao();
                            rowData[3] = obra.getEditora();
                            modelObra.addRow(rowData);
                        }
                    }
                    jTableRelatorio.setModel(modelObra);
                    break;
                case USUARIO_DEBITOS:
                    modelUsuario.addColumn("Nome");
                    modelUsuario.addColumn("Cpf");
                    modelUsuario.addColumn("Total Débitos Pendentes");
                    rowData = new Object[3];
                    for (Usuario usuario : (List<Usuario>) findAllList) {
                        double soma = 0;                        
                        for (Debito debito : usuario.getDebitosPendentes()) {
                            soma += debito.getValor();
                        }
                        rowData[0] = usuario.getNome();
                        rowData[1] = usuario.getCpf();
                        rowData[2] = String.format("R$ %.2f", soma);
                        modelUsuario.addRow(rowData);
                    }
                    jTableRelatorio.setModel(modelUsuario);
                    break;
                case USUARIO_DEVOLUCAO_ATRASO:
                    modelUsuario.addColumn("Nome");
                    modelUsuario.addColumn("Cpf");
                    modelUsuario.addColumn("Número de Devoluções Atrasadas");
                    rowData = new Object[3];
                    for (Usuario usuario : (List<Usuario>) findAllList) {
                        int num = 0;
                        for (Emprestimo emprestimo : usuario.getEmprestimosAtivos()) {
                            if (emprestimo.isAtrasado()) {
                                num++;
                            }
                        }
                        rowData[0] = usuario.getNome();
                        rowData[1] = usuario.getCpf();
                        rowData[2] = num;
                        modelUsuario.addRow(rowData);
                    }
                    jTableRelatorio.setModel(modelUsuario);
                    break;
                case USUARIO_EMPRESTIMO:
                    modelUsuario.addColumn("Nome");
                    modelUsuario.addColumn("Cpf");
                    modelUsuario.addColumn("Número de Empréstimos");
                    rowData = new Object[3];
                    for (Usuario usuario : (List<Usuario>) findAllList) {
                        rowData[0] = usuario.getNome();
                        rowData[1] = usuario.getCpf();
                        rowData[2] = usuario.getEmprestimosAtivos().size();
                        modelUsuario.addRow(rowData);
                    }
                    jTableRelatorio.setModel(modelUsuario);
                    break;
            }
        }

    }

    /**
     * Creates new form JDialogRelatorio
     */
    public JDialogRelatorio(java.awt.Frame parent, boolean modal, TipoRelatorio tipoRelatorio) {
        super(parent, modal);
        initComponents();
        preencherTabela(tipoRelatorio);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabelTitulo = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTableRelatorio = new javax.swing.JTable();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jLabelTitulo.setFont(new java.awt.Font("Arial Black", 0, 24)); // NOI18N
        jLabelTitulo.setText("TITULO");

        jTableRelatorio.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(jTableRelatorio);

        jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/icones/cancelar.png"))); // NOI18N
        jButton1.setText("Fechar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(31, 31, 31)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 593, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jLabelTitulo)
                        .addGap(273, 273, 273))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabelTitulo, javax.swing.GroupLayout.PREFERRED_SIZE, 22, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(41, 41, 41)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 94, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(19, 19, 19))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        dispose();
    }//GEN-LAST:event_jButton1ActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabelTitulo;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTableRelatorio;
    // End of variables declaration//GEN-END:variables
}
